package com.ruyuan.commodity.api;

import com.ruyuan.commodity.domain.*;
import com.ruyuan.commodity.model.goods.dos.CategoryDO;
import com.ruyuan.commodity.model.goods.dos.GoodsDO;
import com.ruyuan.commodity.model.goods.dto.GoodsQueryParam;
import com.ruyuan.commodity.model.goods.vo.*;
import com.ruyuan.commodity.open.api.model.common.WebPage;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;

/**
 * 商品对外的接口
 */
@RequestMapping("/goods/client")
public interface GoodsClient {

    /**
     * 获取新赠商品
     * @param offset 分页偏移量
     * @return 商品信息
     */
    @GetMapping("/{offset}")
    List<BackendGoodsVO> listNewGoods(@PathVariable("offset") Integer offset);

    /**
     * 缓存中查询商品的信息
     *
     * @param goodsId 商品id
     * @return 商品信息
     */
    @GetMapping("/goods/cache/{goodsId}")
    CacheGoods getFromCache(@PathVariable("goodsId") Long goodsId);

    /**
     * 查询sku信息
     * @param skuId 商品SKU id
     * @return 商品SKU信息
     */
    @GetMapping("/goods/sku/{skuId}")
    GoodsSkuVO getSku(@PathVariable("skuId") Long skuId);

    /**
     * 查询SKU信息是否存在
     * @param skuId 商品SKU id
     * @return 是否存在
     */
    @GetMapping("/check/exist/{skuId}")
    Boolean checkExist(@PathVariable("skuId") Long skuId);

    /**
     * 查询多个商品的基本信息
     *
     * @param goodsIds 商品id数组
     * @return 商品选择器结果集
     */
    @GetMapping("/goods/batch/query/{goodsIds}")
    List<GoodsSelectLine> batchQuery(@PathVariable("goodsIds") Long[] goodsIds);

    /**
     * 查询多个sku的基本信息
     *
     * @param skuIds 商品SKU id数组
     * @return 结果集
     */
    @GetMapping("/goods/sku/batch/query/{skuIds}")
    List<GoodsSelectLine> querySkus(@PathVariable("skuIds") Long[] skuIds);

    /**
     * 查询多个商品的基本信息
     *
     * @param goodsIds 商品id数组
     * @return 商品结果集
     */
    @GetMapping("/goods/info/batch/query/{goodsIds}")
    List<GoodsDO> queryDo(@PathVariable("goodsIds") Long[] goodsIds);

    /**
     * 判断商品是否都是某一商家的商品
     *
     * @param goodsIds 商品id数组
     * @return 判断数组中的商品是否都是属于某一家的商品
     */
    @GetMapping("/goods/belong/{goodsIds}")
    Boolean checkSellerGoodsCount(@PathVariable("goodsIds") Long[] goodsIds);

    /**
     * 查询多个商品的信息和参数信息
     * @param goodsIds 商品id集合
     * @return 商品信息以及商品的参数信息
     */
    @GetMapping("/goods/params/{goodsIds}")
    List<Map<String, Object>> getGoodsAndParams(@PathVariable("goodsIds") Long[] goodsIds);

    /**
     * 查询商品信息
     *
     * @param goodsIds 商品id集合
     * @return 商品信息结果集
     */
    @GetMapping("/goods/base/info/{goodsIds}")
    List<Map<String, Object>> getGoods(@PathVariable("goodsIds") Long[] goodsIds);

    /**
     * 根据商家id查询商家商品的信息和参数信息
     *
     * @param sellerId 商户id
     * @return 结果集
     */
    @GetMapping("/getGoodsAndParamsBySellerId/{sellerId}")
    List<Map<String, Object>> getGoodsAndParamsBySellerId(@PathVariable("sellerId") Long sellerId);

    /**
     * 按销量查询若干条数据
     *
     * @param sellerId 商户id
     * @return 结果集
     */
    @GetMapping("/listGoodsBySellerId/{sellerId}")
    List<GoodsDO> listGoodsBySellerId(@PathVariable("sellerId") Long sellerId);

    /**
     * 缓存中查询sku信息
     *
     * @param skuId 商品SKU ID
     * @return 商品SKU信息
     */
    @GetMapping("/getSkuFromCache/{skuId}")
    GoodsSkuVO getSkuFromCache(@PathVariable("skuId") Long skuId);

    /**
     * 查询商品总数
     * @return 商品总数
     */
    @GetMapping("/queryGoodsCount")
    Integer queryGoodsCount();

    /**
     * 根据条件查询商品总数
     *
     * @param status   商品状态
     * @param sellerId 商家id
     * @return 商品总数
     */
    @GetMapping("/countGoodsNumByStatusAndSellerId/{status}/{sellerId}")
    Integer countGoodsNumByStatusAndSellerId(@PathVariable("status") Integer status, @PathVariable("sellerId") Long sellerId);

    /**
     * 查询未删除商品数量 静态化时使用
     * @return 商品数量
     */
    @GetMapping("/queryGoodsCountForPageCreate")
    Integer queryGoodsCountForPageCreate();

    /**
     * 查询某范围的商品信息
     *
     * @param pageNo   页码
     * @param pageSize 每页大小
     * @return 结果集
     */
    @GetMapping("/queryGoodsByRange/{pageNo}/{pageSize}")
    List<Map<String,Object>> queryGoodsByRange(@PathVariable("pageNo") Long pageNo, @PathVariable("pageSize") Long pageSize);

    /**
     * 添加商品快照时使用的接口
     * @param goodsId 商品id
     * @return 商品快照的VO类
     */
    @GetMapping("/queryGoodsSnapShotInfo/{goodsId}")
    GoodsSnapshotVO queryGoodsSnapShotInfo(@PathVariable("goodsId") Long goodsId);

    /**
     * 查询商品列表
     * @param goodsQueryParam 商品的查询条件
     * @return 查询结果
     */
    @PostMapping("/list")
    WebPage list(@RequestBody GoodsQueryParam goodsQueryParam);

    /**
     * 获取商品分类
     * @param id 商品分类主键
     * @return Category 商品分类
     */
    @GetMapping("/getCategory/{id}")
    CategoryDO getCategory(@PathVariable("id") Long id);

    /**
     * 校验商品运费模版是否使用
     *
     * @param templateId 运费模板id
     * @return 商品
     */
    @GetMapping("/getCategory/{templateId}")
    GoodsDO checkShipTemplate(@PathVariable("templateId") Long templateId);

    /**
     * 查询某店铺正在售卖中的商品数量
     * @param sellerId 商家id
     * @return 商品数量
     */
    @GetMapping("/countSellerGoodsNumber/{sellerId}")
    Integer countSellerGoodsNumber(@PathVariable("sellerId") Long sellerId);

    /**
     * 更新指定商家的商品类型
     * @param request 商品状态
     * @return 处理结果
     */
    @PutMapping("/updateGoodsTypeBySellerId")
    Boolean updateGoodsTypeBySellerId(@RequestBody UpdateGoodsTypeBySellerIdRequest request);

    /**
     * 查询某店铺的积分商品
     *
     * @param shopId 商品id
     * @return 积分商品信息列表
     */
    @GetMapping("/listPointGoods/{shopId}")
    List<GoodsDO> listPointGoods(@PathVariable("shopId") Long shopId);

    /**
     * 根据商品id查询所有sku
     *
     * @param goodsId 商品id
     * @return 所有sku
     */
    @GetMapping("/listByGoodsId/{goodsId}")
    List<GoodsSkuVO> listByGoodsId(@PathVariable("goodsId") Long goodsId);

    /**
     * 根据商家id查询出所有的商品信息
     *
     * @param sellerId 商家id
     * @return 所有的商品信息
     */
    @GetMapping("/getSellerGoods/{sellerId}")
    List<GoodsDO> getSellerGoods(@PathVariable("sellerId") Long sellerId);

    /**
     * 查询所有的分类，父子关系
     *
     * @param parentId 父类目id
     * @return 类目VO列表信息
     */
    @GetMapping("/getSellerGoods/{parentId}")
    List<CategoryVO> listAllChildren(@PathVariable("parentId") Long parentId);

}
